home *** CD-ROM | disk | FTP | other *** search
- ;; alloca386.s 1.2
- ;; GNU-compatible stack allocation function for Xenix/386.
- ;; Written by Chip Salzenberg at ComDev.
- ;; Last modified 90/01/11
- ;;> Is your alloca clearly better than the one in i386-alloca.s? I haven't
- ;;> looked at either.
- ;;
- ;;They're different because Xenix/386 has a different assembler. SCO
- ;;Xenix has the Microsoft C compiler and the Microsoft macro assembler,
- ;;called "masm". MASM's assembler syntax is quite different from AT&T's
- ;;in all sorts of ways. Xenix people can't use the AT&T version.
- ;;--
- ;;Chip Salzenberg at ComDev/TCT <chip@tct.uucp>, <uunet!ateng!tct!chip>
-
- TITLE $alloca386
-
- .386
- DGROUP GROUP CONST, _BSS, _DATA
- _DATA SEGMENT DWORD USE32 PUBLIC 'DATA'
- _DATA ENDS
- _BSS SEGMENT DWORD USE32 PUBLIC 'BSS'
- _BSS ENDS
- CONST SEGMENT DWORD USE32 PUBLIC 'CONST'
- CONST ENDS
- _TEXT SEGMENT DWORD USE32 PUBLIC 'CODE'
- ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
-
- PUBLIC _alloca
- _alloca PROC NEAR
-
- ; Get argument.
- pop edx ; edx -> return address
- pop eax ; eax = amount to allocate
-
- ; Validate allocation amount.
- add eax,3
- and eax,not 3
- cmp eax,0
- jg aa_size_ok
- mov eax,4
- aa_size_ok:
-
- ; Allocate stack space.
- mov ecx,esp ; ecx -> old stack pointer
- sub esp,eax ; perform allocation
- mov eax,esp ; eax -> new stack pointer
-
- ; Copy the three saved register variables from old stack top to new stack top.
- ; They may not be there. So we waste twelve bytes. Big fat hairy deal.
- push DWORD PTR 8[ecx]
- push DWORD PTR 4[ecx]
- push DWORD PTR 0[ecx]
-
- ; Push something so the caller can pop it off.
- push eax
-
- ; Return to caller.
- jmp edx
-
- _alloca ENDP
-
- _TEXT ENDS
- END
-